조건 분기 명령 피하기
현대의 프로세스는 여러가지 복잡한 방법들을 사용한다.(파이프 라인, 멀티 쓰레드, …)
이를 사용하기 위해서 추론적 실행(speculative execution)을 한다.
조건 분기 명령을 사용하면 복잡해지기 때문에 이를 최소한으로 사용하는 것이 좋다.
bit_counter(INC)
mov bl,0
mov ecx,32
count_loop:
shl eax,1
jnc skip_inc
inc bl
skip_inc:
loop count_loop
bit_counter(ADC)
mov bl,0
mov ecx,32
count_loop:
shl eax,1
adc bl,0
loop counter_loop
위 두 소스들은 둘 다 EAX register의 켜저있는 bit 수를 세는 소스들이다.
하지만 아래 bit_counter(ADC) 코드는 ADC 명령어를 이용하여
bit_counter(INC) 코드에서 INC 명령어를 피하기 위한 branch instruction 사용을 줄였다.
SETxx
setxx 명령은 특별한 경우에서 분기를 이용하지 않을 수 있는 방법을 제공한다.
setxx는 FLAGS의 상태에 따라 바이트 레지스터나 메모리의 값을 0 or 1 로 바꾸어 준다.
SETxx의 조건이 참이라면 그 결과는 1, 거짓이면 0이 저장된다.
이를 이용하여 분기명령을 최소한으로 사용한 최대값을 찾는 소스 코드
max.asm